package com.dinzeer.legendreliclib.lib.util;

import net.minecraft.commands.arguments.EntityAnchorArgument;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.AABB;
import java.util.Comparator;
import java.util.Optional;

/**
 * 实体传送工具类，提供便捷的实体传送功能。
 * <p>
 * 该类包含两个主要方法：
 * <ul>
 *   <li>{@link #teleportToTarget(LivingEntity, LivingEntity)}：将实体传送到目标实体面前。</li>
 *   <li>{@link #teleportToNearestEntity(LivingEntity)}：将实体传送到同一 Y 轴范围内最近的实体面前。</li>
 * </ul>
 */
public class TransmissionUtils {
    /**
     * 将实体传送到目标实体面前。
     * <p>
     * 该方法计算目标实体正前方 1.5 格的位置，并将指定实体传送到该位置，同时使其面向目标实体。
     *
     * @param owner  要传送的实体
     * @param target 目标实体（传送目的地）
     */
    public static void teleportToTarget(LivingEntity owner, LivingEntity target) {
        // 计算目标实体面前的位置（正前方1.5格处）
        double x = target.getX() + target.getLookAngle().x * 1.5;
        double y = target.getY();
        double z = target.getZ() + target.getLookAngle().z * 1.5;
        
        // 执行传送
        owner.teleportTo(x, y, z);
        // 传送后强制面向目标实体
        owner.lookAt(EntityAnchorArgument.Anchor.EYES, target.getEyePosition());
    }
    
    /**
     * 将实体传送到同一 Y 轴（允许±10 格偏移）最近的实体面前。
     * <p>
     * 该方法在以实体为中心的水平 10 格范围内搜索符合条件的最近实体，并执行传送操作。
     *
     * @param owner 要传送的实体
     */
    public static void teleportToNearestEntity(LivingEntity owner) {
        Level level = owner.level();
        double searchRange = 10.0; // 水平搜索范围
        
        // 定义搜索区域（以owner为中心的水平10格范围）
        AABB searchArea = new AABB(
            owner.getX() - searchRange, 
            owner.getY() ,
            owner.getZ() - searchRange,
            owner.getX() + searchRange, 
            owner.getY() + 10, // 允许向上10格偏移
            owner.getZ() + searchRange
        );
        
        // 查找符合条件的最近实体
        Optional<LivingEntity> nearestEntity = level.getEntitiesOfClass(
                LivingEntity.class, 
                searchArea, 
                e -> e != owner // 排除自身
            )
            .stream()
            .filter(e -> Math.abs(e.getY() - owner.getY()) <= 10) // 确保y轴偏移在10格内
            .min(Comparator.comparingDouble(e -> e.distanceToSqr(owner))); // 按距离排序
        
        // 如果找到实体，执行传送
        nearestEntity.ifPresent(entity -> teleportToTarget(owner, entity));
    }
}